﻿#include <iostream>
/* glad必须先包含，后包含glfw */
#include "glad/glad.h"
#include "glfw/glfw3.h"

// 声明且实现窗体变化回调
void frameBufferSizeCallBack(GLFWwindow* window, int width, int height)
{
  std::cout << "窗体最新大小：" << width << " " << height << std::endl;
  glViewport(0, 0, width, height);
}

// 声明且实现键盘回调
void keyCallBack(GLFWwindow* window, int key, int scancode, int action, int mods)
{
  if (key == GLFW_KEY_W)
  {

  }

  if (action == GLFW_PRESS)
  {

  }

  if (mods == GLFW_MOD_CONTROL)
  {

  }

  if (mods == GLFW_MOD_SHIFT)
  {

  }

  std::cout << "按下了：" << key << std::endl;
  std::cout << "action：" << action << std::endl;
  std::cout << "mods：" << mods << std::endl;
}

int main()
{
  // 1 初始化GLFW基本环境
  glfwInit();
  // 1.1设置OpenGL主版本、次版本
  glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
  glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
  // 1.2设置核心模式（非立即渲染模式）
  glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

  // 2 创建窗体对象
  GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGLStudy", NULL, NULL);
  // 设置当前窗体对象为OpenGL的绘制平台
  glfwMakeContextCurrent(window);
  // 设置窗体尺寸回调
  glfwSetFramebufferSizeCallback(window, frameBufferSizeCallBack);
  // 设置键盘事件回调
  glfwSetKeyCallback(window, keyCallBack);

  /* 使用glad加载所有当前版本的opengl函数 */
  if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
  {
    std::cout << "Failed to initialize GLAD" << std::endl;
    return -1;
  }

  /* 设置opengl视口以及清理颜色 */
  glViewport(0, 0, 800, 600);
  glClearColor(0.2f, 0.3f, 0.3f, 1.0f);

  // 3 执行窗体循环
  while (!glfwWindowShouldClose(window))
  {
    // 3.1接受并分发窗体消息
    // 3.2检查消息队列是否存在需要处理的消息
    glfwPollEvents();

    // 执行opengl画布清理操作
    glClear(GL_COLOR_BUFFER_BIT);
    // 渲染操作
    // 切换双缓存
    glfwSwapBuffers(window);
  }

  // 4 退出程序前清理
  glfwTerminate();
  return 0;
}